[25_04_19]WindowsC++のシステムコール&エンコーディング問題

2025-04-19 | 技術



何日ぐらいかかり、今日でGithub.io用のブログの大筋を完成させた。

この静的ブログを作るのに最も大変だったのは、日本語のディレクトリの処理だった。

もともとは、ファイル名を日本語でするつもりだった。でも、なぜかデバッグしてみても原因が把握できなかった。

変数の内容を見ればロジックの問題はなさそうだったが、ofstreamのコードがエラーを吐いた。


問題のコード:


ofstream f(new_title);
if (f.is_open()) {
f << new_post;
f.close();
} else { cout << "[ofstream] ディレクトリのアクセス不可能\n"; }


ここで f.is_open()を通過せずエラーになっていた。

ここで考えてた可能性は一つしかないはずだと確信していた。

ディレクトリ(=new_title)の設計のミス。これしかないって。

だが、何回も修正したり、確認したり、デバッグしたりしても問題はいたちごっこ...

熱心にグーグルで探してみたさきに、いよいよ原因を理解した。

Windows 10のg++でコンパイルしていたが、どうやらWindows環境のC++の複雑なエンコーディングが問題だったらしい。

ostreamでファイルの生成をしたら、内部的にはシステムコールするようになる。

そのシステムコールのファンクションで、CreateFileA()が使われるが、

このファンクションはWindowsの環境ではANSIエンコーディングのみが認識できるので

UTF-8の日本語を使うとシステムコール失敗になる。

Linux環境では大丈夫らしいけど、Windowsなら一応英語のディレクトリを設定した方がよさそうだ...

俺もタイトルとファイル名を別々にして解決した。